/*
 * Project Name : NOBUNAGA
 * Created on 2007/01/31
 */
package jp.sengoku.oda {
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.events.Event;
	
	import mx.managers.SystemManager;
	
	import mx.controls.Button;
	import mx.core.Application;
	import mx.core.FlexSprite;
	import mx.core.UIComponent;
	import mx.events.FlexEvent;
	import mx.events.PropertyChangeEvent;
	import mx.controls.Text;
	import mx.controls.TextInput;

	/**
	 * 拡張ボタンクラス
	 * 設定したショートカットキー押下で、Clickイベントが発生する
	 * このClassの手法は、非表示コンテナ内のイベントを封じるなどに応用可
	 * 
	 * @author	morimotohiroki@gmail.com
	 */
	public class HideyoshiButton extends Button {

		// ショートカットキーのキーコードを保持する変数
		private var _tansyuku:Number = -1;

		/**
		 * コンストラクタでござる
		 */
		public function HideyoshiButton() {
			super();
		}
		
		/**
		 * childrenCreatedでござる
		 */
		protected override function childrenCreated():void{
			super.childrenCreated();
			this.systemManager.addEventListener(KeyboardEvent.KEY_UP, _keyUpHandler);
			this.systemManager.addEventListener(FlexEvent.SHOW ,this._startKeyListen ,true);
			this.systemManager.addEventListener(FlexEvent.HIDE ,this._stopKeyListen ,true);
		}
		
		/**
		 * コンテナの中のDisplayObjectを階層インデント付きでtrace
		 * @param container
		 * @param indentString
		 * 
		 */
		public function traceDisplayList(container:DisplayObjectContainer, indentString:String = ""):void {
		    var child:DisplayObject;
		    for (var i:uint=0; i < container.numChildren; i++) {
		        child = container.getChildAt(i);
		        trace (indentString, child, child.name);
		        if (container.getChildAt(i) is DisplayObjectContainer) {
		            traceDisplayList(DisplayObjectContainer(child), indentString + "    ")
		        }
		    }
		}
		
		/**
		 * 指定コンテナの中に特定のDisplayObjectがあるかを再帰的に調べる
		 * @param container	対象コンテナ
		 * @param targetObj	検索対象オブジェクト
		 * @return Boolean	あるかないか
		 * 
		 */
		public function isExistInDisplayList(container:DisplayObjectContainer ,targetObj:*):Boolean {
		    var rtnValue:Boolean = false;
		    var child:DisplayObject;
		    for (var i:uint=0; i < container.numChildren; i++) {
		        child = container.getChildAt(i);
		        if(child === targetObj as DisplayObject){
		        	rtnValue = true;
		        	break;
		        }
		        if (container.getChildAt(i) is DisplayObjectContainer) {
		            rtnValue = isExistInDisplayList(DisplayObjectContainer(child) ,targetObj);
		        }
		    }
		    return rtnValue;
		}
		/**
		 * キーの監視開始
		 * 
		 * @param	event	
		 * @return	void
		 */
		private function _startKeyListen(event:FlexEvent):void {
			if(isExistInDisplayList(event.target as DisplayObjectContainer ,this)){
				this.systemManager.addEventListener(KeyboardEvent.KEY_UP, _keyUpHandler);
			}
		}
		/**
		 * キーの監視終了
		 * 
		 * @param	event	
		 * @return	void
		 */
		private function _stopKeyListen(event:FlexEvent):void {
			if(isExistInDisplayList(event.target as DisplayObjectContainer ,this)){
				this.systemManager.removeEventListener(KeyboardEvent.KEY_UP, _keyUpHandler);
			}
		}
		
		/**
		 * キーボード押下イベントハンドラ
		 * 
		 * @param	event	キーボードイベント
		 * @return	void
		 */
		private function _keyUpHandler(event:KeyboardEvent):void {
			// テキスト編集中にショートカットが起動するため条件分岐
			// TextAreaやComboBoxにフォーカスがある場合にもチェックするべき？
			if (!(focusManager.getFocus() as TextInput)) {
				if (_tansyuku > -1 && event.keyCode == _tansyuku) {
					
					super.clickHandler(new MouseEvent(MouseEvent.CLICK));
	
					// これだと、Clickイベントを無理やり発行していることになる
					dispatchEvent(new MouseEvent(MouseEvent.CLICK));
					
				}
			}
		}

		/**
		 * override updateDisplayList
		 * 
		 * @param	unscaledWidth	Width
		 * @param	unscaledHeight	Hieght
		 * @return	void
		 * 
		 */		
		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {

			//
			var index:Number = this.label.search(String.fromCharCode(_tansyuku));

			trace(index);

			if(index > -1) {
				this.textField.htmlText = this.label.replace(String.fromCharCode(_tansyuku), "<u>" + this.label.charAt(index) + "</u>");
			} else {
				this.label = this.label + "(" + String.fromCharCode(_tansyuku) + ")";
			}

			super.updateDisplayList(unscaledWidth, unscaledHeight);
		}
		
		
		/**
		 * ショートカットキー設定
		 * 
		 * @param	num	キーコード
		 * @return	void
		 */
		public function set shortcutKey(num:Number):void {
			_tansyuku = num;

			invalidateDisplayList();
		}

		/**
		 * ショートカットキー取得
		 * 
		 * @return	Number	キーコード
		 */		
		public function get shortcutKey():Number {
			return _tansyuku;			
		}
		
		
	}
}